#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>




int main(int argc, char** argv)
{


    

    //socket 函数：创建一个新套接字
    // 参数意义：
    // 第一个参数：地址家族，通常是 AF_INET
    // 第二个参数：套接字类型，通常有两种：SOCK_STREAM（流套接字，用于 TCP 协议通信） 和 SOCK_DGRAM（数据报式套接字，用于 UDP 协议通信）
    // 第三个参数：通常为 0， 表示使用默认协议。
    // 返回值为新套接字的文件描述符，如果失败则为 -1

    // 第一步：创建一个新的套接字
    int sock = socket(AF_INET, SOCK_STREAM, 0);

    if(-1 == sock)
    {
        perror("socket");
        return 1;
    }

    // // 第二步：绑定地址

    // // 指定地址信息
    // struct sockaddr_in myaddr;
    // myaddr.sin_family = AF_INET;            // 指定地址家族为 Internet 地址家族
    // myaddr.sin_addr.s_addr = INADDR_ANY;    // 指定 IP 地址为本机任意地址
    // //myaddr.sin_addr.s_addr = inet_addr("192.168.0.56");    // 指定 IP 地址为本机某个确定的 IP 地址
    // myaddr.sin_port = htons(8888);          // 指定端口号为 8888
    // // htons：将一个短整型数据从主机字节序（通常是小端）转换为网络字节序（通常是大端）
    // // inet_addr：将字符串形式的 IP 地址转换为无符号 32 位整数，并且是网络字节序

    // // 将上面指定的地址和套接字绑定
    // if(-1 == bind(sock, (struct sockaddr*)&myaddr, sizeof(myaddr)))
    // {
    //     perror("bind");
    //     return 1;
    // }

    // 第三步：连接服务器

    // 指定服务器的地址
    struct sockaddr_in srv_addr;
    srv_addr.sin_family = AF_INET;
    srv_addr.sin_addr.s_addr = inet_addr(argv[1]);
    srv_addr.sin_port = htons(atoi(argv[2]));

    if(-1 == connect(sock, (struct sockaddr*)&srv_addr, sizeof(srv_addr)))
    {
        perror("connect");
        return 1;
    }

    // 第四步：收发数据

    // 发送数据
    char msg[300];
    char wgc[1024];
    char www[300];
    int ret;

    // 接收数据，如果当前没有任何数据，recv 函数会阻塞当前线程，直到成功接收到数据或对方端开连接（返回 0）或出错（返回 -1）。
    char a = 'c';

    ret = recv(sock, msg, sizeof(msg), 0);
    strcpy(www, msg);
    // read(sock_conn, msg, sizeof(msg));  // 和上面的写法等效
    if(ret <= 0)
    {
        return 1;
    }
	FILE* fp = fopen(www,"w");
	if(fp == NULL)
	{
		perror("fopen fail");
		return 1;
	}
   
    while(1)
    {
        /*printf("我说：");
        scanf("%s", msg);
        ret = send(sock, msg, sizeof(msg), 0);
        //write(sock_conn, msg, sizeof(msg));  // 和上面的写法等效
        if(ret <= 0)
        {
            break;
        }
        if(ret == sizeof(msg))
        {
            printf("发送成功！\n");
        }
        if(strcmp(msg, "再见") == 0)
        {
            break;
        }*/
        ret = recv(sock, wgc, sizeof(wgc), 0);
        // read(sock_conn, msg, sizeof(msg));  // 和上面的写法等效
        if(ret <= 0)
        {
            break;
        }
        if(ret > 0)
        {
            fwrite(wgc, ret,1,fp); //接收文件数据内容
        }
        
    }
    fclose(fp);
    // 第五步：端开连接
    close(sock);
    
    return 0;
}
